#include <iostream>

using std::cout;
using std::endl;


//外部类
class MyClass
{
public:
//默认访问权限是私有的
    //嵌套类(内部类)
    class A
    {
    public:
        void display() const
        {
            cout << this->_a2 << endl;
            cout << _sa3 << endl;
        }

        void print(const MyClass & mc) 
        {
            //在内部类成员函数中访问外部类的非静态数据成员时，也需要
            //传递外部类对象或指针或引用, 与this指针有关
            //外部类数据成员是私有的，也可以直接访问
            cout << mc._b << endl;   
            //嵌套类中可以直接访问外部类的静态数据成员，不需要依赖于
            //外部类对象、指针或引用
            //cout << MyClass::_a << endl;
            cout << _a << endl;
        }

        friend MyClass;

    private:
        int _a2;
        static int _sa3;
    };

    void func(const A & a0){
        _b = 100;//类的成员函数内访问_b
        //外部类不能直接访问内部类中的数据成员
        //cout << _a2 << endl;//error
        cout << a0._a2 << endl;//非静态成员需要传递嵌套类的对象或指针或引用
        //cout << _sa3 << endl;//error 
        cout << A::_sa3 << endl;//嵌套类的静态成员可以直接通过类名访问
        cout << _a << endl;
    }

//public:
private:
    static int _a;//位于全局静态区
    int _b;//4
    A _a1;//只有在外部类的中声明了嵌套类的对象或引用或指针才会占据空间
};
int MyClass::_a = 0;

void test0(){
    MyClass::_a = 200;//类外部访问静态成员_a，必须是public的

    //嵌套类直接创建对象需要是public的
    MyClass::A a;
    cout << "sizeof(MyClass::A):" << sizeof(MyClass::A) << endl;

    cout << "sizeof(MyClass):" << sizeof(MyClass) << endl;
}

int main()
{
    test0();
    return 0;
}

